chore(cd): prepare the 10.0.0-rc.1 release - #2599
Conversation
Move the release train from beta to a release candidate. release-please's prerelease strategy only increments the trailing number of the current prerelease, so `prerelease-type` alone would still cut 10.0.0-beta.33. Set `release-as: 10.0.0-rc.1` in the manifest config so the next release PR proposes rc.1 for every linked package while the changelog range still starts at the beta.32 tags. The March alpha-to-beta switch instead reset the manifest and package versions to beta.0, which made release-please replay history into the beta.1 changelog because no beta.0 tag existed. Remove `release-as` once rc.1 has shipped, or every later release PR will propose rc.1 again. cd.yml has been invalid YAML since #2446: the release checkout guard's `? 0 : 1` sat in a plain scalar, so no Deployment run on main has reached release-please since 2026-08-28 and the release PR froze at beta.33. Put the command in a block scalar. `pnpm publish` only sets `latest`, so npm's `next` tag still pointed at 10.0.0-alpha.11. Add an npm dist-tag workflow that moves a tag onto a published version of every public package, run it from cd.yml after each release for `next`, and expose it through workflow_dispatch so `next` can be repointed by hand today. Swap the beta labels in the READMEs, installation guide, browser support page, and site pill for release candidate wording. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
✅ Deploy Preview for vjs10-site ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
@videojs/cdn
@videojs/core
@videojs/element
@videojs/html
@videojs/media
@videojs/react
@videojs/spf
@videojs/store
@videojs/utils
@videojs/cloudflare-video
@videojs/dash-video
@videojs/hlsjs-video
@videojs/mux-audio
@videojs/mux-video
@videojs/native-hls-video
@videojs/shaka-video
@videojs/spotify-audio
@videojs/tiktok-video
@videojs/twitch-video
@videojs/vimeo-video
@videojs/wistia-video
@videojs/youtube-video
@videojs/google-cast
@videojs/mux-data
commit: |
📦 Bundle Size Report🎨 @videojs/html — no changesPresets (7)
Media (18)
Players (5)
Skins (29)
UI Components (62)
⚛️ @videojs/react — no changesPresets (7)
Media (22)
Extensions (2)
Players (5)
Skins (18)
UI Components (39)
🧩 @videojs/core — no changesEntries (76)
🏷️ @videojs/element — no changesEntries (2)
📦 @videojs/store — no changesEntries (3)
🔧 @videojs/utils — no changesEntries (13)
📦 @videojs/cdn — no changes📦 @videojs/cloudflare-video — no changes📦 @videojs/dash-video — no changes📦 @videojs/google-cast — no changes📦 @videojs/hlsjs-video — no changes📦 @videojs/media — no changesEntries (3)
📦 @videojs/mux — no changes📦 @videojs/mux-audio — no changesEntries (2)
📦 @videojs/mux-data — no changes📦 @videojs/mux-video — no changesEntries (2)
📦 @videojs/native-hls-video — no changes📦 @videojs/shaka-video — no changes📦 @videojs/spf — no changesEntries (7)
📦 @videojs/spotify-audio — no changes📦 @videojs/tiktok-video — no changes📦 @videojs/twitch-video — no changes📦 @videojs/vimeo-video — no changes📦 @videojs/wistia-video — no changesEntries (2)
📦 @videojs/youtube-video — no changesℹ️ How to interpretEach entry is independently bundled, minified, and brotli-compressed. Initial size includes its static import graph; lazy dynamic chunks are reported separately. Entries are not additive because their dependency graphs overlap. Preset rows represent realistic combined bundles. Changes of 300 B or less across initial, lazy, and total size are collapsed, not discarded. Run |
Add a September 2026 release candidate milestone to the homepage roadmap, README timeline, and roadmap doc, and move the GA target to fall 2026. Let cd.yml mint a GitHub App installation token for release-please when the RELEASE_APP_ID variable is set, so release PRs and tags are attributed to the app's bot user instead of a maintainer's personal token. The personal token remains the fallback until the app is configured. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Match the cli and spf README banners to the other packages, drop the browser-support aside, and point the installation aside at the release candidate announcement. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
The 88% figure came from the beta comparison. Measured the same way today, the default HTML player is 62.8% smaller than the Video.js 8 default bundle (gzip), so the post now says over 60%. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
The GitHub App token step for release-please now lands separately in #2616 so it can merge and be tested ahead of the release candidate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Resolve the release-please config against the new package list, keeping every package on the rc prerelease type, and keep the block scalar for the release checkout verification that main lost again in #2598. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
|
The failing publish check (Preview Releases / pkg-pr-new) is not this PR's. It fails identically on Generated by Claude Code |
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
✅ Deploy Preview for vjs-registry canceled.
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 4a86ef7. Configure here.
The dist-tag loop only globbed packages/*/package.json, so the public packages under packages/adapters/ and packages/extensions/ never received the tag. Match the publish filter in cd.yml. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
The package READMEs stay here because they ship inside the npm tarballs. Everything that deploys on merge waits for rc.1 to be live. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj
| "tag-separator": "@", | ||
| "include-component-in-tag": true, | ||
| "include-v-in-tag": false, | ||
| "release-as": "10.0.0-rc.1", |
There was a problem hiding this comment.
this shouldn't be needed unless you want to pin it to a specific version. if we keep this we'll need to update it each release I believe
There was a problem hiding this comment.
Ah. I meant to put this in the PR body. I'm going to hard-code it for this release and take it out afterwards.
|
CI note: the
No targeted fix is open yet. #2633 reworks the React thumbnail parts but is a feature change, not a fix for this assertion, so I have not ported it here. Everything else on this head is green. Generated by Claude Code |
|
E2E triage: real regression (inherited from |
| outputs: | ||
| released: ${{ steps.release.outputs.releases_created }} | ||
| version: ${{ steps.release.outputs['packages/html--version'] }} |
There was a problem hiding this comment.
why is this needed? we already have access to those outputs without these lines
There was a problem hiding this comment.
Within the release job, yes: steps.release.outputs.* is available to every later step, and the existing steps use it that way. The new dist-tag job at the bottom of the file is a separate job, because it uses: the reusable npm-dist-tag.yml workflow and a reusable workflow can only be called at the job level, not as a step. Cross-job, the only way to read a step's output is needs.release.outputs.*, and that requires the producing job to declare outputs:. That is all these three lines do.
Generated by Claude Code
There was a problem hiding this comment.
lol sorry Wes. My Claude is eager to respond.
To add additional context: we have a new dist-tag job to catch @next up to our leading edge and keep it there (it's been pointing at alpha this whole time)

Moves the release train from beta to a release candidate. This PR is the release tooling plus the package READMEs that ship inside the npm tarballs; everything that deploys on merge (site copy, root README, blog post) is in #2658 and waits for rc.1 to be live.
What this does
1. Cuts the next release as
10.0.0-rc.1instead of10.0.0-beta.33.release-please's
prereleasestrategy only increments the trailing number of the existing prerelease, so switchingprerelease-typetorcalone would still produce beta.33. This PR sets a top-level"release-as": "10.0.0-rc.1"; with thelinked-versionsplugin every package (27, including the new@videojs/cdnand adapter packages) lands on rc.1, and the changelog range stays anchored to the beta.32 tags.release-asis temporary. It is hard-coded for this one release and #2658 removes it once rc.1 has shipped. While it remains, every release PR proposes rc.1.The March alpha→beta switch (#846, #850) instead reset the manifest and package versions to
beta.0. That works, but because nobeta.0tag existed release-please replayed history into the beta.1 changelog and emitted a brokenbeta.0...beta.1compare link, so I avoided repeating it.prerelease-typeis also flipped torcon every package so the config reads truthfully; it has no effect while a prerelease version is already current.2. Fixes the npm
nextdist-tag.pnpm publishonly setslatest, sonexthas pointed at10.0.0-alpha.11for the whole beta channel (and@videojs/cli/@videojs/mediahave nonextat all). New.github/workflows/npm-dist-tag.ymlmoves a dist-tag onto a published version of every public workspace package, including the nestedpackages/adapters/*andpackages/extensions/*buckets.cd.ymlcalls it after each release fornext, and it is alsoworkflow_dispatch-able.3. Swaps "Beta" for "Release Candidate" in the 9 package READMEs. These are the READMEs npm shows for each package, so they have to be on main before the release PR merges.
The cd.yml YAML fix and the GitHub App attribution that used to be part of this PR landed separately in #2616 and #2632.
After merging
chore: release mainproposing 10.0.0-rc.1 across all packages. Check that its diff is only version bumps and changelogs before merging it (see fix: resolve stale html lockfile from #2617 #2629 for what a stale regeneration looked like).next.release-asand publishes the announcement. Until it lands, any push to main makes release-please open a release PR proposing rc.1 again; don't merge that one.Not done here
Verification
actionlintoncd.ymlandnpm-dist-tag.yml: clean../packages/**publish filter.release-as+linked-versionsconfirmed against release-please v17 source (strategies/base.tsbuildNewVersion,plugins/linked-versions.tspreconfigure).SandboxCI failure is pre-existing on main (same assertion, same value); see the comment below.🤖 Generated with Claude Code
https://claude.ai/code/session_01JZ5RTqfnRMiiASH1T7tWVj